import axios from 'axios'
import store from '@/store'
import qs from 'qs'
import { getAdminToken } from '@/utils/storages'

let baseApi = ""
// 判断是生产环境或者开发环境
if (import.meta.env.MODE === 'development') {
    baseApi = window.configs.baseTestApi
} else if (import.meta.env.MODE === 'production') {
    if (import.meta.env.VITE_APP_FLAG === 'pro') {
        baseApi = window.configs.baseApi
    } else if (import.meta.env.VITE_APP_FLAG === 'uat') {
        baseApi = window.configs.baseUatApi
    } else if (import.meta.env.VITE_APP_FLAG === 'test') {
        baseApi = window.configs.baseTestApi
    } else {
        baseApi = window.configs.baseApi
    }
}

// 创建axios实例
const service = axios.create({
    baseURL: baseApi, // api的base_url
    timeout: 600000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(config => {
    // 在发送请求之前做些什么
    if (store.getters.token) {
        config.headers['Authorization'] = "Bearer " + getAdminToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    if (config.method == 'get' || config.method == 'delete') {
        // 统一转换分页数据
        if (config.params) {
            config.params = window.$Common.mxPageToSkipCount(config.params)
        }
        // 如果是get请求，且params是数组类型如arr=[1,2]，则转换成arr=1&arr=2
        config.paramsSerializer = function(params) {
            return qs.stringify(params, { arrayFormat: 'repeat' })
        }
    }
    return config
}, error => {
    // 请求错误时做什么
    console.log(error) // 打印错误信息
    Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(response => {
    /**
    * 对响应数据做点什么
    * success非true表示请求失败
    */
    const res = response.data
    if (res.status === 200) {
        return res.data
    } else if (res.status === 401) {
        // unAuthorizedRequest 表示授权失败
        if (res.unAuthorizedRequest) {
            loginOutDialog()
            return false
        }
    } else {
        try {
            // 其他错误弹出提示
            window.$Common.errorMsg(res.error.message || res.error.details, {
                duration: 5 * 1000,
                onClose: () => {
                    window.$Common.closeFullLoading()
                }
            })
            return Promise.reject('error: ' + res.error.message)
        } catch(e) {
            return res
        }
    }
}, error => {
    // 对响应错误做点什么
    console.log(error.response) // 打印错误信息
    if (error.response && error.response.status === 401) {
      loginOutDialog()
      return Promise.reject(error)
    }
    if (error.response && error.response.status === 403) {
        window.$Common.errorMsg(error.response.data && error.response.data.error && error.response.data.error.message || "没有访问权限!", {
            duration: 2500,
            onClose: () => {
                window.$Common.closeFullLoading()
            }
        })
        return Promise.reject(error)
    }
    window.$Common.errorMsg(error && error.response && error.response.data && error.response.data.error && error.response.data.error.message || error, {
        duration: 3 * 1000,
        onClose: () => {
            window.$Common.closeFullLoading()
        }
    })
    return Promise.reject(error)
})

// 登出提示
function loginOutDialog () {
    window.$Common.confirm('当前登录信息已过期，请重新登录!', '确定退出', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
    }).then(() => {
        store.dispatch('loginOut').then(() => {
          location.reload()// 为了重新实例化vue-router对象 避免bug
        })
    })
}

export default service